package io.framework.common.utils;

/**
 * @author thomas
 * @date 2020-01-02
 */
public class IQI {

    static final int[] I = {0, 50, 100, 150, 200, 300, 400, 500};

    static final int[][] CA = {
            {0, 35, 75, 115, 150, 250, 350, 500}    // PM2.5
            , {0, 50, 150, 250, 350, 420, 500, 600}    // PM10
            , {0, 50, 150, 475, 800, 1600, 2100, 2620}    // SO2
            , {0, 2, 4, 14, 24, 36, 48, 60}    // CO
            , {0, 40, 80, 180, 280, 565, 750, 940}    // NO2
    };


    // 类型
    public enum Type {
        PM2_5(0), PM10(1), SO2(2), CO(3), NO2(4);
        int v;

        Type(int v) {
            this.v = v;
        }
    }

    public static int iaqi(int c, Type type) {
        return iaqi(c, CA[type.v]);
    }

    // 计算aqi通过PM2.5
    private static int iaqi(int c, int[] C) {
        // 极值判断
        if (c <= 0) {
            return 0;
        }

        // 获取索引位置
        int h = 0;
        int l = 0;
        if (c >= C[C.length - 1]) {
            h = C.length - 1;
        } else {
            for (int i = 0; i < C.length - 1; i++) {
                if (C[i] <= c && C[i + 1] >= c) {
                    h = i + 1;
                    break;
                }
            }
        }
        l = h - 1;

        // 开始赋值
        int Ih = I[h];
        int Il = I[l];
        int Ch = C[h];
        int Cl = C[l];
        if (Ch - Cl == 0) {
            return c;
        }
        int I = ((Ih - Il) * (c - Cl) / (Ch - Cl)) + Il;
        return I;
    }

    //    AQI共分六级，从一级优，二级良，三级轻度污染，四级中度污染，直至五级重度污染，六级严重污染。空气污染指数划分为0－50、51－100、101－150、151－200、201－300和大于300六档。
    //    空气质量指数级别: 1: 一级（优）2: 二级（良）3: 三级（轻度污染） 4: 四级（中度污染） 5: 五级（重度污染） 6: 六级（严重污染）
    public static int level(int iqi) {
        if (iqi > 300) {
            return 6;
        } else if (iqi >= 201) {
            return 5;
        } else if (iqi >= 151) {
            return 4;
        } else if (iqi >= 101) {
            return 3;
        } else if (iqi >= 51) {
            return 2;
        } else {
            return 1;
        }
    }

    public static int pm2_5(int c) {
        return IQI.iaqi(c, Type.PM2_5);
    }

    public static int pm10(int c) {
        return IQI.iaqi(c, Type.PM10);
    }

    public static int so2(int c) {
        return IQI.iaqi(c, Type.SO2);
    }

    public static int co(int c) {
        return IQI.iaqi(c, Type.CO);
    }

    public static int no2(int c) {
        return IQI.iaqi(c, Type.NO2);
    }


    public static void main(String[] args) {

        int aqi = IQI.iaqi(40, Type.PM2_5);
        System.out.println(aqi);
    }

}
